import { Token ,LoginResponse} from '@/types/data'
import { http } from '@/utils/http'
import { setToken } from '@/utils/token'
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'
// import { Toast } from 'antd-mobile'
import type { AxiosError } from 'axios'

// 登录接口返回数据的类型
// type LoginResponse = {
//   message: string
//   data: Token
// }

// 登录
export const login = createAsyncThunk(
  'login/login',
  async (loginData: { mobile: string; code: string }, { rejectWithValue }) => {
    try {
      // 发送请求，实现登录
      const res = await http.post<LoginResponse>('/authorizations', loginData)
      // 保存到本地缓存中
      setToken(res.data.data)
      // 存储到 redux
      return res.data.data
    } catch (e) {
      const error = e as AxiosError<{ data: null; message: string }>
      // 如果只是一个跟组件无关的错误处理，可以直接在此处进行
      // 但是，如果错误处理跟组件相关（比如，验证码错误时，让文本框获得焦点），就需要在组件中通过 try...catch 来处理
      // Toast.show({
      //   content: error.response?.data.message,
      //   duration: 1000,
      // })
      return rejectWithValue(error.response?.data)
    }
  }
)


// 发送验证码

export const sendCode =createAsyncThunk(
  'login/sendCode',
  async (mobile: string) => {
    await http.get(`/sms/codes/${mobile}`)
  }
)


// 刷新后redux中token失效解决
// 方法一
// const initialState:Token=getToken()

const initialState: Token = {
  // 登录token
  token: '',
  // 刷新token，在 token 过期后，用来换取新的 token
  refresh_token: '',
}

const loginSlice = createSlice({
  name: 'login',
  initialState,
  reducers: {},

  extraReducers: builder => {
    // 处理登录时状态
    builder.addCase(login.fulfilled, (state, action) => {
      return action.payload
    })
  },
})

export default loginSlice.reducer
